---------Swiss Family Robinson---------
A 4am crack                  2017-08-12
-------------------. updated 2021-08-27
                   |___________________

Name: Swiss Family Robinson
Genre: adventure
Year: 1984
Credits: Tom Snyder Productions
Publisher: Windham Classics
Platform: Apple ][+ or later
Media: single-sided 5.25-inch floppy
OS: custom

                   ~

               Chapter 0
   In Which The Tools Do Not Save Us


This disk was automatically cracked by
Passport. Here is the transcript:

                 --v--

READING FROM S6,D1
USING BUILT-IN RWTS
WRITING TO S5,D2
T10,S0F FOUND E7 BITSTREAM
T10,S0F,$A4: AC00AC00AC00AC00AC00AC00 ->
 78A8589C30C004A8589C58A8
CRACK COMPLETE.

                 --^--

[Narrator]
But the crack was not complete.

The copy that Passport produces is in a
standard format, fully readable by
third-party tools. But when I boot it,
the disk loads the title screen then
reboots when I press "G" to start the
game.

Disks generally do not reboot unless
someone tells them to.

                   ~

Turning to my trusty Disk Fixer sector
editor, I search for "BD 89 C0" (the
instruction to turn on the drive motor
manually) and find the protection check
on track $10.

                 --v--

T10,S0D
----------- DISASSEMBLY MODE ----------
0000:A9 0A          LDA   #$0A
0002:85 50          STA   $50

; turn on drive motor manually and
; reset the data latch
0004:A2 60          LDX   #$60
0006:BD 89 C0       LDA   $C089,X
0009:BD 8E C0       LDA   $C08E,X

; ($48) -> $BF7E
000C:A9 7E          LDA   #$7E
000E:85 48          STA   $48
0010:A9 BF          LDA   #$BF
0012:85 49          STA   $49

; Death Counter
0014:A9 80          LDA   #$80
0016:85 51          STA   $51
0018:C6 51          DEC   $51

; if Death Counter hits 0, fail
001A:F0 5C          BEQ   $0078

; based on my knowledge of similar
; protection checks, this subroutine
; almost certainly finds the next
; available address prologue and parses
; the address field into zero page
; (like $B944 in DOS 3.3)
001C:20 03 BE       JSR   $BE03

; if that fails for some reason, fail
001F:B0 57          BCS   $0078

; loop until we find the right sector
0021:A5 2D          LDA   $2D
0023:C9 0F          CMP   #$0F
0025:D0 F1          BNE   $0018

; and now we're positioned for the
; start of the E7 check
0027:A0 00          LDY   #$00
0029:BD 8C C0       LDA   $C08C,X
002C:10 FB          BPL   $0029
002E:88             DEY
002F:F0 47          BEQ   $0078
...

                 --^--

I stared at this code for a while but
could not see why the universal E7
patch (applied by Passport) would fail.
The code is functionally identical to
hundreds of other disks I've seen.

The real problem is in that subroutine
at $BE03. Take a look:

                 --v--

T10,S0C (loaded at $BE00)
----------- DISASSEMBLY MODE ----------
0003:A0 FC          LDY   #$FC
0005:84 26          STY   $26
0007:C8             INY
0008:D0 04          BNE   $000E
000A:E6 26          INC   $26
000C:F0 51          BEQ   $005F

; find "D5 AA 96" (standard address
; prologue)
000E:BD 8C C0       LDA   $C08C,X
0011:10 FB          BPL   $000E
0013:C9 D5          CMP   #$D5
0015:D0 F0          BNE   $0007
0017:EA             NOP
0018:BD 8C C0       LDA   $C08C,X
001B:10 FB          BPL   $0018
001D:C9 AA          CMP   #$AA
001F:D0 F2          BNE   $0013
0021:A0 03          LDY   #$03
0023:BD 8C C0       LDA   $C08C,X
0026:10 FB          BPL   $0023
0028:C9 96          CMP   #$96
002A:D0 E7          BNE   $0013

; parse address field (4-and-4 encoded
; values for disk volume number, track,
; sector, and a checksum)
002C:A9 00          LDA   #$00
002E:85 27          STA   $27
0030:BD 8C C0       LDA   $C08C,X
0033:10 FB          BPL   $0030
0035:2A             ROL
0036:85 26          STA   $26
0038:BD 8C C0       LDA   $C08C,X
003B:10 FB          BPL   $0038
003D:25 26          AND   $26
003F:99 2C 00       STA   $002C,Y
0042:45 27          EOR   $27
0044:88             DEY
0045:10 E7          BPL   $002E
0047:A8             TAY
0048:D0 15          BNE   $005F

; find address epil---oh dear now I see
; the problem
004A:BD 8C C0       LDA   $C08C,X
004D:10 FB          BPL   $004A
004F:C9 FF          CMP   #$FF
0051:D0 0C          BNE   $005F
0053:EA             NOP
0054:BD 8C C0       LDA   $C08C,X
0057:10 FB          BPL   $0054
0059:C9 FF          CMP   #$FF
005B:D0 02          BNE   $005F
005D:18             CLC
005E:60             RTS
005F:38             SEC
0060:60             RTS

                 --^--

The original disk uses "FF FF" for the
address epilogue, instead of the usual
"DE AA". No problem for Passport; it
read the disk with its built-in RWTS
and converted it to a standard format.
That's so basic, it didn't even bother
to mention it. And the original disk's
RWTS doesn't care what the epilogues
are -- the Passport copy was able to
read itself, no grinding, no problem.

Except for the copy protection, which
is coded separately and is more strict
in finding the address epilogues while
it's positioning itself to look for the
E7 bitstream.

Simple fix: change the #$FF at $BE50
and $BE5A to standard values.

T10,S0C,$50: FF -> DE
T10,S0C,$5A: FF -> AA

]PR#6
...works, and it is glorious...

Quod erat liberandum.

                   ~

               Changelog


2021-08-27

- re-cracked with latest Passport, new
  E7 patch improves compatibility on
  Apple //c and IIgs

2017-08-12

- initial release

---------------------------------------
A 4am crack                    No. 1360
------------------EOF------------------
